home *** CD-ROM | disk | FTP | other *** search
- /*------------------------------------------------------------------------
- Fichier : Scope.C
- Contenu : Gestion des caractères reçus
- --------------------------------------------------------------------------
-
- Fonctions :
- TopWndScope : Traite les messages
- AfficheBufferBin : Affiche le buffer binaire
- AfficheBufferTexte : Affiche le buffer texte
- DirectAdvise : Met en / hors service l'advise direct
- EffaceScope : Efface les buffers et la fenêtre
- ReceptionDirecteBinaire : Traite les caractères binaires entrant
- ReceptionDirecteTexte : Traite les caractères textes entrant
- wmCreateScope : Traite le message WM_CREATE
- wmMdiActivateScope : Traite le message WM_MDIACTIVATE
- wmSizeListeScope : Traite le message WM_SIZE
- wmuRefreshScope : Traite le message de rafriachissement
- OptionsSupervision : Affiche la boite des options
- DlgProcOptSup : DlgProc de la boite d'options
-
- ------------------------------------------------------------------------*/
-
- #include <windows.h>
- #include <stdlib.h>
- #include <ddeml.h>
- #include "testdde.h"
- #include "build\testdde.dec"
- #include "dialogs.h"
-
- #define MAX_ASCII 500
- #define MAX_BIN 500
-
- //------------------------------------------------------------------------
- // Variables globales
- //------------------------------------------------------------------------
-
- int TypeDisplayScope=0; // 0= Texte 1=Binaire
- int MonitorFlow=0; // Bit 0 Texte, Bit 1 Hexa
-
- unsigned char BufAscii[MAX_ASCII]; // Tampon pour les caractères ASCII
- int NbreAscii; // Nombre de caractère dans le tampon
- int EcritureAscii; // Pointeur d'écriture dans le tampon
-
- unsigned char BufBin[MAX_BIN]; // Tampon pour les caractères binaire
- int NbreBin; // Nombre de caractère dans le tampon
- int EcritureBin; // Pointeur d'écriture dans le tampon
-
- //------------------------------------------------------------------------
- // Création de la fenêtre des alarmes
- //------------------------------------------------------------------------
-
- void wmCreateScope(HWND hWnd)
- {
- HFONT hFont;
-
- // Mémorise le handle de la fenêtre
- hWndScope=hWnd;
-
- // Création de la listbox des noms de chassis
- CreateWindow("LISTBOX","",
- WS_VISIBLE|WS_VSCROLL|WS_CHILD|
- LBS_DISABLENOSCROLL|LBS_NOTIFY|LBS_NOINTEGRALHEIGHT,
- CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
- hWnd,FF_SCOPE,hInst,NULL);
-
- // Impose la police au champ d'édition
- hFont=GetStockObject(ANSI_FIXED_FONT);
- SendDlgItemMessage(hWnd,FF_SCOPE,WM_SETFONT,hFont,0l);
-
- // Initialisation
- EcritureAscii=0;
- NbreAscii=0;
- EcritureBin=0;
- NbreBin=0;
- TypeDisplayScope=0;
- }
-
- //------------------------------------------------------------------------
- // Traitement du message WM_MDIACTIVATE
- //------------------------------------------------------------------------
-
- void wmMdiActivateScope (HWND hWnd,WPARAM wParam)
- {
- if (wParam) ChangeMenuMDI(hWnd,MENU_SCOPE,2);
- }
-
-
- //------------------------------------------------------------------------
- // Dimensionement de la fenêtre
- //------------------------------------------------------------------------
-
- void wmSizeListeScope (HWND hWnd,WPARAM wParam,LPARAM lParam)
- {
- // Redimensionne la list box
- MoveWindow(GetDlgItem(hWnd,FF_SCOPE),0,0,LOWORD(lParam),HIWORD(lParam),TRUE);
- }
-
-
- //------------------------------------------------------------------------
- // Rafraîchissement du contenu de la boite
- //------------------------------------------------------------------------
-
- void wmuRefreshScope(HWND hWnd)
- {
- switch (TypeDisplayScope)
- {
- case 0 : AfficheBufferTexte(hWnd);break;
- case 1 : AfficheBufferBin(hWnd);break;
- }
- }
-
- //------------------------------------------------------------------------
- // Fonction de traitement des messages
- //------------------------------------------------------------------------
-
- long FAR PASCAL TopWndScope(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
- {
- int r=1;
-
- switch (message)
- {
- case WMU_ASYNCBINAIRE : ReceptionDirecteBinaire(wParam);break;
- case WMU_ASYNCTEXTE : ReceptionDirecteTexte(wParam);break;
- case WMU_BINAIRE : TypeDisplayScope=1;wmuRefreshScope(hWnd);break;
- case WMU_ASCII : TypeDisplayScope=0;wmuRefreshScope(hWnd);break;
- case WM_MDIACTIVATE : wmMdiActivateScope(hWnd,wParam);break;
- case WM_SYSCOMMAND : return(wmSysCommandChild(hWnd,wParam,lParam));
- case WM_CREATE : wmCreateScope (hWnd);break;
- case WM_SIZE : wmSizeListeScope (hWnd,wParam,lParam);break;
- case WMU_REFRESH : wmuRefreshScope(hWnd);r=1;break;
- }
-
- if (r)
- return (DefMDIChildProc(hWnd, message, wParam, lParam));
- else
- return (NULL);
- }
-
-
- //------------------------------------------------------------------------
- // Traitement sur réception d'un caractère texte directement
- //------------------------------------------------------------------------
-
- void ReceptionDirecteTexte(WPARAM c)
- {
- // Ecriture des caractères dans le tampon
- BufAscii[EcritureAscii]=(char)c;
- if (NbreAscii < MAX_ASCII) NbreAscii++; // Plafonne le nombre de caractères
- if (EcritureAscii < MAX_ASCII-1) EcritureAscii++; else EcritureAscii=0;
- }
-
-
- //------------------------------------------------------------------------
- // Traitement sur réception d'un caractère Binaire directement
- //------------------------------------------------------------------------
-
- void ReceptionDirecteBinaire(WPARAM c)
- {
- // Ecriture des caractères dans le tampon
- BufBin[EcritureBin]=(char) c;
- if (NbreBin < MAX_BIN) NbreBin++; // Plafonne le nombre de caractères
- if (EcritureBin < MAX_BIN-1) EcritureBin++; else EcritureBin=0;
- }
-
-
- //------------------------------------------------------------------------
- // Place le texte dans la list box
- //------------------------------------------------------------------------
-
- void AfficheBufferTexte(HWND hWnd)
- {
- int p;
- int n,c,j;
- char ligne[100];
- char car[5];
-
- // Détermine le début du buffer
- if (NbreAscii<MAX_ASCII) p=0; else p=EcritureAscii;
-
- // Vide la liste
- SendDlgItemMessage(hWnd,FF_SCOPE,LB_RESETCONTENT,0,0);
-
- // Affiche tout les caractères
- c=0;
- for (j=0;j<43;j++) ligne[j]=' ';ligne[j]=0; // Efface la ligne
- for (n=0;n<NbreAscii;n++)
- {
- wsprintf(car,"%02X ",BufAscii[p]);
- ligne[c*3]=car[0];ligne[c*3+1]=car[1];
- ligne[c+33]=BufAscii[p];
- c++;
- if (c>9)
- {
- SendDlgItemMessage(hWnd,FF_SCOPE,LB_ADDSTRING,0,(LPARAM)(LPCSTR)ligne);
- for (j=0;j<43;j++) ligne[j]=' ';ligne[j]=0;
- c=0;
- }
- if (p<MAX_ASCII-1) p++; else p=0;
- }
-
- // Affiche une ligne incomplète
- if (c) SendDlgItemMessage(hWnd,FF_SCOPE,LB_ADDSTRING,0,(LPARAM)(LPCSTR)ligne);
-
- // Lecture du nombre de ligne
- c=(int) SendDlgItemMessage(hWnd,FF_SCOPE,LB_GETCOUNT,0,0);
- if (c>0) SendDlgItemMessage(hWnd,FF_SCOPE,LB_SETCURSEL,c-1,0);
- }
-
- //------------------------------------------------------------------------
- // Place le texte dans la list box
- //------------------------------------------------------------------------
-
- void AfficheBufferBin(HWND hWnd)
- {
- int p;
- int n,c,j;
- char ligne[100];
- char car[5];
-
- // Détermine le début du buffer
- if (NbreBin<MAX_BIN) p=0; else p=EcritureBin;
-
- // Vide la liste
- SendDlgItemMessage(hWnd,FF_SCOPE,LB_RESETCONTENT,0,0);
-
- // Affiche tout les caractères
- c=0;
- for (j=0;j<43;j++) ligne[j]=' ';ligne[j]=0; // Efface la ligne
- for (n=0;n<NbreBin;n++)
- {
- wsprintf(car,"%02X ",BufBin[p]);
- ligne[c*3]=car[0];ligne[c*3+1]=car[1];
- if ((BufBin[p]>31)&&(BufBin[p]<128))
- ligne[c+33]=BufBin[p];
- else
- ligne[c+33]=(unsigned char)183;
- c++;
- if (c>9)
- {
- SendDlgItemMessage(hWnd,FF_SCOPE,LB_ADDSTRING,0,(LPARAM)(LPCSTR)ligne);
- for (j=0;j<43;j++) ligne[j]=' ';ligne[j]=0;
- c=0;
- }
- if (p<MAX_BIN-1) p++; else p=0;
- }
-
- // Affiche une éventuelle ligne incomplète
- if (c) SendDlgItemMessage(hWnd,FF_SCOPE,LB_ADDSTRING,0,(LPARAM)(LPCSTR)ligne);
-
- // Lecture du nombre de ligne
- c=(int) SendDlgItemMessage(hWnd,FF_SCOPE,LB_GETCOUNT,0,0);
- if (c>0) SendDlgItemMessage(hWnd,FF_SCOPE,LB_SETCURSEL,c-1,0);
- }
-
- //------------------------------------------------------------------------
- // Effacement des contenu du scope
- //------------------------------------------------------------------------
-
- void EffaceScope(void)
- {
- EcritureAscii=0;
- NbreAscii=0;
- EcritureBin=0;
- NbreBin=0;
- wmuRefreshScope(hWndScope);
- }
-
- //------------------------------------------------------------------------
- // Edition des options de supervision
- //------------------------------------------------------------------------
-
- void OptionsSupervision (HWND hWnd)
- {
- FARPROC lpProc;
- int r;
-
- lpProc = MakeProcInstance(DlgProcOptSup, hInst);
- r=DialogBox(hInst,MAKEINTRESOURCE(DLGOPTIONSANALYSE),hWnd,lpProc);
- FreeProcInstance(lpProc);
-
-
- // Traitement des advise directes (sans passer par DDE)
-
- // Vérifie s'il faut changer le type d'advise
- if ((r!=-1)&&(r!=MonitorFlow) && hConversation)
- {
- DirectAdvise (r);
- }
- // Mémorise l'état
- MonitorFlow=r;
- }
-
- //------------------------------------------------------------------------
- // DlgProc de la boîte des options de supervision
- //------------------------------------------------------------------------
-
- BOOL FAR PASCAL DlgProcOptSup(HWND hDlg,unsigned message,WPARAM wParam,LPARAM lParam)
- {
- int r;
-
- switch (message)
- {
- case WM_INITDIALOG:
- if (MonitorFlow & MONITOR_BINAIRE) CheckDlgButton(hDlg,ID_BINAIRE,1);
- if (MonitorFlow & MONITOR_TEXTE) CheckDlgButton(hDlg,ID_TEXTE,1);
- return (TRUE);
- case WM_COMMAND:
- switch (wParam)
- {
- case ID_AIDE : AppelAide(hDlg,7);return TRUE;
- case IDOK : r=0;
- if (IsDlgButtonChecked(hDlg,ID_TEXTE)) r|=MONITOR_TEXTE;
- if (IsDlgButtonChecked(hDlg,ID_BINAIRE)) r|=MONITOR_BINAIRE;
- EndDialog(hDlg,r);return (TRUE);
- case IDCANCEL : EndDialog(hDlg,-1);return (TRUE);
- }
- break;
- }
- return (FALSE);
- }
-
- //--------------------------------------------------------------------
- // Mise en ou hors / service du "DirectAdvise"
- //--------------------------------------------------------------------
-
- void DirectAdvise (int r)
- {
- int mt,mb;
- char mes[50];
-
- // Vérifie s'il faut un advise texte
- if (r & MONITOR_TEXTE) mt=WMU_ASYNCTEXTE; else mt=0;
-
- // Vérifie s'il faut un advise binaire
- if (r & MONITOR_BINAIRE) mb=WMU_ASYNCBINAIRE; else mb=0;
-
- // Constitution de la chaine de commande
- wsprintf(mes,"DirectAdvise \"%04X %04X %04X\"",hWndScope,mb,mt);
-
- // Envoi l'ordre à Winitel
- if (!EnvoiCommandeDDE(mes))
- {
- LoadString(hInst,106,mes,sizeof mes);
- MessageBox(hWndMain,mes,NULL,MB_OK|MB_ICONEXCLAMATION);
- r = 0;
- }
- }
-